//Refer Google Doc: auto_ptr与shared_ptr --- auto_ptr ...cpp
//
#include <iostream>
#include <boost/shared_ptr.hpp>

using namespace std ;

class Foo
{
private:
    int n ;

public:
    Foo(int _n) : n(_n) { }

    void print()
    {
        cout<< "n=" << n << endl ;
    }
} ;

//auto_ptr的 对象所有权是独占性的！
//这决定了不可能有两个auto_ptr对象同时拥有同一动态对象的所有权，
//从而也导致了auto_ptr的拷贝行为是非对等的，其中伴随着对象 所有权的转移。
//同时也不要将auto_ptr放进标准库的容器中，否则在标准库容器无准备的拷贝行为中
//（标准库容器需要的拷贝行为是等价的），会导致难以发觉 的错误。
int f ()
{
    auto_ptr<Foo> pt1 ( new Foo(1) ) ;
    auto_ptr<Foo> pt2 ;

    pt2 = pt1 ;

    pt1->print() ; //pt1 is already a NULL pointer. will lead to segment fault.

    return 0 ;
}

int main ()
{
    boost::shared_ptr<Foo> pt1 ( new Foo(1) ) ;
    boost::shared_ptr<Foo> pt2 ;

    pt2 = pt1 ;

    pt1->print() ; //shared_ptr is OK.

    cout<< "Will Run f() \n"  ;

    f() ;

    return 0 ;
}
